home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d1 / eddtv4.arc / EDSHOWDP.ASM < prev    next >
Assembly Source File  |  1988-03-28  |  20KB  |  465 lines

  1.          PAGE 78,120
  2.          TITLE OèÄ EDDT - EXTENDED DRIVE DESCRIPTION TABLESö
  3.          SUBTTL Display Current Drive Parameters program
  4.          .286
  5. PAGE_0   SEGMENT AT 0             ; DEFINE LOW MEMORY
  6.          ORG   041H*4             ; SKIP TO DRIVE 0 VECTOR
  7. ED_DRIV0 DD    ?                  ; DRIVE 0 PARAMETER VECTOR
  8.          ORG   ED_DRIV0           ; REDEFINE VECTOR
  9. ED_D0OFF DW    ?                  ; DRIVE 0 VECTOR OFFSET
  10. ED_D0SEG DW    ?                  ; DRIVE 0 VECTOR SEGMENT
  11.          ORG   046H*4             ; SKIP TO DRIVE 0 VECTOR
  12. ED_DRIV1 DD    ?                  ; DRIVE 1 PARAMETER VECTOR
  13.          ORG   ED_DRIV1           ; REDEFINE VECTOR
  14. ED_D1OFF DW    ?                  ; DRIVE 1 VECTOR OFFSET
  15. ED_D1SEG DW    ?                  ; DRIVE 1 VECTOR SEGMENT
  16. PAGE_0   ENDS                     ; END OF SEGMENT
  17. ;-----------------------------------------------------------------------
  18. ;             ROM BIOS DATA AREAS
  19. ;-----------------------------------------------------------------------
  20. DATA     SEGMENT AT 40H
  21. RS232_BASE       DW 4 DUP(?)      ; ADDRESSES OF RS232 ADAPTERS
  22. PRINTER_BASE     DW 4 DUP(?)      ; ADDRESSES OF PRINTERS
  23. EQUIP_FLAG       DW ?             ; INSTALLED HARDWARE
  24. MFG_TST          DB ?             ; INITIALIZATION FLAG
  25. MEMORY_SIZE      DW ?             ; MEMORY SIZE IN K BYTES
  26. MFG_ERR_FLAG     DB ?             ; SCRATCH PAD FOR MANUFACTURING
  27.                  DB ?             ; ERROR CODES
  28. ;-----------------------------------------------------------------------
  29. ;             KEYBOARD DATA AREAS
  30. ;-----------------------------------------------------------------------
  31. KB_FLAG          DB ?             ; KEYBOARD STATUS
  32. KB_FLAG_1        DB ?             ; SECOND BYTE OF KEYBOARD STATUS
  33. ALT_INPUT        DB ?             ; STORAGE FOR ALTERNATE KEYPAD ENTRY
  34. ;
  35. ; ----- SHIFT FLAG EQUATES WITHIN KB_FLAG
  36. ;
  37. INS_STATE        EQU 80H          ; INSERT SATE IS ACTIVE
  38. CAPS_STATE       EQU 40H          ; CAPS LOCK STATE HAS BEEN TOGGLED
  39. NUM_STATE        EQU 20H          ; NUM LOCK STATE HAS BEEN TOGGLED
  40. SCROLL_STATE     EQU 10H          ; SCROLL LOCK STATE HAS BEEN TOGGLED
  41. ALT_SHIFT        EQU 08H          ; ALTERNATE SHIFT KEY DEPRESSED
  42. CTL_SHIFT        EQU 04H          ; CONTROL SHIFT KEY DEPRESSED
  43. LEFT_SHIFT       EQU 02H          ; LEFT SHIFT KEY DEPRESSED
  44. RIGHT_SHIFT      EQU 01H          ; RIGHT SHIFT KEY DEPRESSED
  45.                  ORG 001AH        ; ORG TO KEYBOARD BUFFER
  46. BUFFER_HEAD      DW  ?            ; POINTER TO HEAD OF KEYBOARD BUFFER
  47. BUFFER_TAIL      DW  ?            ; POINTER TO TAIL OF KEYBOARD BUFFER
  48. KB_BUFFER        DW  16 DUP(?)    ; ROOM FOR 15 ENTRIES
  49.                  ORG 0049H        ; ORG TO START OF DISPLAY DATA
  50. ;-----------------------------------------------------------------------
  51. ;             VIDEO DISPLAY DATA AREA
  52. ;-----------------------------------------------------------------------
  53. CRT_MODE         DB  ?            ; CURRENT CRT MODE
  54. CRT_COLS         DW  ?            ; NUMBER OF COLS ON SCREEN
  55. CRT_LEN          DW  ?            ; LENGTH OF REGEN IN BYTES
  56. CRT_START        DW  ?            ; STARTING ADDRESS IN REGEN BUFFER
  57. CURSOR_POSN      DW  8 DUP(?)     ; CURSOR FOR EACH OF UP TO 8 PAGES
  58. CURSOR_MODE      DW  ?            ; CURRENT CURSOR MODE SETTING
  59. ACTIVE_PAGE      DB  ?            ; CURRENT PAGE BEING DISPLAYED
  60. ADDR_6845        DW  ?            ; BASE ADDRESS FOR ACTIVE DISPLAY CARD
  61. CRT_MODE_SET     DB  ?            ; CURRENT SETTING OF THE 3X8 REGISTER
  62. CRT_PALETTE      DB  ?            ; CURRENT PALETTE SETTING COLOR CARD
  63. ;-----------------------------------------------------------------------
  64. ;             POST AND BIOS WORK DATA AREA
  65. ;-----------------------------------------------------------------------
  66. IO_ROM_INIT      DW  ?            ; PNTR TO OPTIONAL I/O ROM INIT ROUTINE
  67. IO_ROM_SEG       DW  ?            ; POINTER TO I/O ROM SEGMENT
  68. INTR_FLAG        DB  ?            ; FLAG TO INDICATE AN INTERRUPT HAPPENE
  69. ;-----------------------------------------------------------------------
  70. ;             TIMER DATA AREA
  71. ;-----------------------------------------------------------------------
  72. TIMER_LOW        DW  ?            ; LOW WORD OF TIMER COUNT
  73. TIMER_HIGH       DW  ?            ; HIGH WORD OF TIMER COUNT
  74. TIMER_OFL        DB  ?            ; TIMER HAS ROLLED OVER SINCE READ
  75. ;-----------------------------------------------------------------------
  76. ;             SYSTEM DATA AREA
  77. ;-----------------------------------------------------------------------
  78. BIOS_BREAK       DB  ?            ; BIT 7=1 IF BREAK KEY DEPRESSED
  79. RESET_FLAG       DW  ?            ; WORD=1234H IF KEYBOARD RESET
  80. ;-----------------------------------------------------------------------
  81. ;             FIXED DISK DATA AREA
  82. ;-----------------------------------------------------------------------
  83. DISK_STATUS1     DB  ?            ; FIXED DISK STATUS
  84. HF_NUM           DB  ?            ; COUNT OF FIXED DISKS
  85. CONTROL_BYTE     DB  ?            ; HEAD CONTROL BYTE
  86. PORT_OFF         DB  ?            ;  RESERVED (PORT OFFSET)
  87. ;
  88.                  ORG 0080H        ; ORG TO START OF ADDITIONAL KB DATA
  89. BUFFER_START     DW  ?
  90. BUFFER_END       DW  ?
  91. DATA     ENDS
  92. CSEG     SEGMENT PARA PUBLIC 'CODE' ; IDENTIFY CODE SEGMENT
  93.          PAGE
  94.          INCLUDE EDDT_MAC.LIB
  95.          ASSUME CS:CSEG,DS:CSEG,ES:CSEG  ; INITIAL ASSUMPTION
  96.          ORG    0100H             ; SKIP OVER PSP
  97. TST_START:
  98.          JMP   TST_GO
  99. ED_DPRM1 EQU   $
  100.          DFLD  01,30,07,'FIXED DRIVE PARAMETERS'
  101. ED_DPRM2 EQU   $
  102.          DFLD  03,44,07,'Drive 0     Drive 1'
  103. ED_DPRM3 EQU $
  104.          DFLD  04,18,07,'Cylinders                  0000D       0000D'
  105. ED_DPRM4 EQU $
  106.          DFLD  05,18,07,'Heads                        00D         00D'
  107. ED_DPRM5 EQU $
  108.          DFLD  06,18,07,'Write Pre-Compensation     0000H       0000H'
  109. ED_DPRM6 EQU $
  110.          DFLD  07,18,07,'Control Byte                 00H         00H'
  111. ED_DPRM7 EQU $
  112.          DFLD  08,18,07,'Landing Zone               0000D       0000D'
  113. ED_DPRM8 EQU $
  114.          DFLD  09,18,07,'Sectors/Track                00D         00D'
  115. ED_WORKA DB    '        '
  116. ED_HD0PM DB    16 DUP(0)
  117. ED_HD1PM DB    16 DUP(0)
  118. ED_INVM1 EQU   $
  119.          DFLD  10,28,15,'INVALID MACHINE DETECTED'
  120. ED_INVM2 EQU   $
  121.          DFLD  24,20,15,'SETUP MUST BE RUN ON AN AT OR COMPATIBLE'
  122. TST_GO:
  123. ;
  124. ; ----- MAKE SURE WE'RE RUNNING ON AN AT
  125. ;
  126.          MOV   AX,0FFFFH          ; GET LAST SEGMENT ADDRESS
  127.          MOV   ES,AX              ;   IN ES REGISTER
  128.          MOV   AL,ES:[0EH]        ; GET MODEL_BYTE
  129.          CMP   AL,0FCH            ; GOOD AT TYPE ?
  130.          JE    ED_MODOK           ; ...YES - CONTINUE
  131.          CMP   AL,0FBH            ; GOOD AT TYPE ?
  132.          JE    ED_MODOK           ; ...YES - CONTINUE
  133.          CLS                      ; CLEAR THE SCREEN
  134. ;
  135.          WCS   ED_INVM1           ; WRITE ERROR MESSAGE 1
  136. ;
  137.          WCS   ED_INVM2           ; WRITE ERROR MESSAGE 2
  138. ;
  139.          MOV   AH,4CH             ; RETURN TO CALLER
  140.          INT   21H
  141. ED_MODOK:
  142.          MOV   AX,0               ; ZERO AX
  143.          MOV   DS,AX              ; AND SET DS TO PAGE 0
  144.          LDS   SI,ED_DRIV0        ; GET OFFSET/SEGMENT DRIVE 0 DATA
  145.          LEA   DI,ED_HD0PM        ; GET OFFSET OUR AREA
  146.          PUSH  CS                 ; CS TO STACK
  147.          POP   ES                 ; GET SEGMENT OF OUR AREA
  148.          MOV   CX,16/2            ; GET LENGTH OF DATA
  149.      REP MOVSW                    ; AND MOVE IT
  150. ;
  151.          MOV   AX,0               ; ZERO AX
  152.          MOV   DS,AX              ; AND SET DS TO PAGE 0
  153.          LDS   SI,ED_DRIV1        ; GET OFFSET/SEGMENT DRIVE 0 DATA
  154.          LEA   DI,ED_HD1PM        ; GET OFFSET OUR AREA
  155.          MOV   CX,16/2            ; GET LENGTH OF DATA
  156.      REP MOVSW                    ; AND MOVE IT
  157.          PUSH  CS                 ; CS TO STACK
  158.          POP   DS                 ; DS OFF
  159.          PUSH  CS                 ; CS TO STACK
  160.          POP   ES                 ; ES OFF STACK
  161. ;
  162.          CLS
  163. ;
  164. ; -----  LIST THE DRIVE PARAMETERS ON THE SCREEN
  165. ;
  166. ED_LDP   PROC  NEAR               ; DEFINE PROCEDURE
  167. ;
  168.          WCS   ED_DPRM1,,CS       ; WRITE DISK PARM TABLE MESSAGE
  169. ;
  170.          WCS   ED_DPRM2,,CS       ; WRITE DISK PARM TABLE MESSAGE
  171. ;
  172.          WCS   ED_DPRM3,,CS       ; WRITE DISK PARM TABLE MESSAGE
  173. ;
  174.          WCS   ED_DPRM4,,CS       ; WRITE DISK PARM TABLE MESSAGE
  175. ;
  176.          WCS   ED_DPRM5,,CS       ; WRITE DISK PARM TABLE MESSAGE
  177. ;
  178.          WCS   ED_DPRM6,,CS       ; WRITE DISK PARM TABLE MESSAGE
  179. ;
  180.          WCS   ED_DPRM7,,CS       ; WRITE DISK PARM TABLE MESSAGE
  181. ;
  182.          WCS   ED_DPRM8,,CS       ; WRITE DISK PARM TABLE MESSAGE
  183. ;
  184. ; -----  WRITE PARMS FOR DRIVE 0 --------------------------------
  185. ;
  186. ; -----  GET THE NUMBER OF CYLINDERS
  187. ;
  188.          MOV   AX,WORD PTR ED_HD0PM+00 ; GET NUMBER OF CYLS
  189. ;
  190. ; -----  CONVERT NUMBER OF CYLS TO DECIMAL ASCII & PRINT
  191. ;
  192.          CALL  ED_CVDA            ; CONVERT TO ASCII
  193. ;
  194.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  195.          INT   10H                ; RUPT TO BIOS
  196. ;
  197.          LEA   BP,ED_WORKA        ; ES:BP POINT TO WORK AREA
  198.          MOV   DX,042DH           ; SET ROW/COL
  199.          MOV   CX,4               ; LENGTH OF STRING
  200.          MOV   BL,07H             ; WRITE ATTRIBUTE
  201.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  202.          INT   10H                ; RUPT TO BIOS
  203. ;
  204. ; -----  GET THE NUMBER OF HEADS
  205. ;
  206.          MOV   AL,BYTE PTR ED_HD0PM+02 ; GET NUMBER OF HEADS
  207.          MOV   AH,0               ; ZERO AH
  208. ;
  209. ; -----  CONVERT NUMBER OF HEADS TO DECIMAL ASCII & PRINT
  210. ;
  211.          CALL  ED_CVDA            ; CONVERT TO ASCII
  212. ;
  213.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  214.          INT   10H                ; RUPT TO BIOS
  215. ;
  216.          LEA   BP,ED_WORKA+2      ; ES:BP POINT TO WORK AREA
  217.          MOV   DX,052FH           ; SET ROW/COL
  218.          MOV   CX,2               ; LENGTH OF STRING
  219.          MOV   BL,07H             ; WRITE ATTRIBUTE
  220.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  221.          INT   10H                ; RUPT TO BIOS
  222. ;
  223. ; -----  GET THE WRITE PRE-COMP CYL
  224. ;
  225.          MOV   AX,WORD PTR ED_HD0PM+05 ; GET PRE-COMP CYLS
  226. ;
  227. ; -----  CONVERT WRITE PRE-COMP TO HEX ASCII & PRINT
  228. ;
  229.          CALL  ED_CVHA            ; CONVERT TO ASCII
  230. ;
  231.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  232.          INT   10H                ; RUPT TO BIOS
  233. ;
  234.          LEA   BP,ED_WORKA        ; ES:BP POINT TO WORK AREA
  235.          MOV   DX,062DH           ; SET ROW/COL
  236.          MOV   CX,4               ; LENGTH OF STRING
  237.          MOV   BL,07H             ; WRITE ATTRIBUTE
  238.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  239.          INT   10H                ; RUPT TO BIOS
  240. ;
  241. ; -----  GET THE CONTROL BYTE
  242. ;
  243.          MOV   AX,WORD PTR ED_HD0PM+08 ; GET CONTROL BYTE
  244. ;
  245. ; -----  CONVERT CONTROL BYTE TO HEX ASCII & PRINT
  246. ;
  247.          CALL  ED_CVHA            ; CONVERT TO ASCII
  248. ;
  249.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  250.          INT   10H                ; RUPT TO BIOS
  251. ;
  252.          LEA   BP,ED_WORKA+3      ; ES:BP POINT TO WORK AREA
  253.          MOV   DX,072FH           ; SET ROW/COL
  254.          MOV   CX,1               ; LENGTH OF STRING
  255.          MOV   BL,07H             ; WRITE ATTRIBUTE
  256.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  257.          INT   10H                ; RUPT TO BIOS
  258. ;
  259. ; -----  GET THE LANDING ZONE
  260. ;
  261.          MOV   AX,WORD PTR ED_HD0PM+12 ; GET LANDING ZONE
  262. ;
  263. ; -----  CONVERT LANDING ZONE TO DECIMAL ASCII & PRINT
  264. ;
  265.          CALL  ED_CVDA            ; CONVERT TO ASCII
  266. ;
  267.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  268.          INT   10H                ; RUPT TO BIOS
  269. ;
  270.          LEA   BP,ED_WORKA        ; ES:BP POINT TO WORK AREA
  271.          MOV   DX,082DH           ; SET ROW/COL
  272.          MOV   CX,4               ; LENGTH OF STRING
  273.          MOV   BL,07H             ; WRITE ATTRIBUTE
  274.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  275.          INT   10H                ; RUPT TO BIOS
  276. ;
  277. ; -----  GET SECTORS/TRACK
  278. ;
  279.          MOV   AL,BYTE PTR ED_HD0PM+14 ; GET SECTORS/TRACK
  280.          MOV   AH,0               ; CLEAR AH
  281. ;
  282. ; -----  CONVERT SECTORS/TRACK TO DECIMAL ASCII & PRINT
  283. ;
  284.          CALL  ED_CVDA            ; CONVERT TO ASCII
  285. ;
  286.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  287.          INT   10H                ; RUPT TO BIOS
  288. ;
  289.          LEA   BP,ED_WORKA+2      ; ES:BP POINT TO WORK AREA
  290.          MOV   DX,092FH           ; SET ROW/COL
  291.          MOV   CX,2               ; LENGTH OF STRING
  292.          MOV   BL,07H             ; WRITE ATTRIBUTE
  293.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  294.          INT   10H                ; RUPT TO BIOS
  295. ;
  296. ; -----  WRITE PARMS FOR DRIVE 1 --------------------------------
  297. ;
  298. ; -----  GET THE NUMBER OF CYLINDERS
  299. ;
  300.          MOV   AX,WORD PTR ED_HD1PM+00 ; GET NUMBER OF CYLS
  301. ;
  302. ; -----  CONVERT NUMBER OF CYLS TO DECIMAL ASCII & PRINT
  303. ;
  304.          CALL  ED_CVDA            ; CONVERT TO ASCII
  305. ;
  306.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  307.          INT   10H                ; RUPT TO BIOS
  308. ;
  309.          LEA   BP,ED_WORKA        ; ES:BP POINT TO WORK AREA
  310.          MOV   DX,0439H           ; SET ROW/COL
  311.          MOV   CX,4               ; LENGTH OF STRING
  312.          MOV   BL,07H             ; WRITE ATTRIBUTE
  313.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  314.          INT   10H                ; RUPT TO BIOS
  315. ;
  316. ; -----  GET THE NUMBER OF HEADS
  317. ;
  318.          MOV   AL,BYTE PTR ED_HD1PM+02 ; GET NUMBER OF HEADS
  319.          MOV   AH,0               ; ZERO AH
  320. ;
  321. ; -----  CONVERT NUMBER OF HEADS TO DECIMAL ASCII & PRINT
  322. ;
  323.          CALL  ED_CVDA            ; CONVERT TO ASCII
  324. ;
  325.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  326.          INT   10H                ; RUPT TO BIOS
  327. ;
  328.          LEA   BP,ED_WORKA+2      ; ES:BP POINT TO WORK AREA
  329.          MOV   DX,053BH           ; SET ROW/COL
  330.          MOV   CX,2               ; LENGTH OF STRING
  331.          MOV   BL,07H             ; WRITE ATTRIBUTE
  332.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  333.          INT   10H                ; RUPT TO BIOS
  334. ;
  335. ; -----  GET THE WRITE PRE-COMP CYL
  336. ;
  337.          MOV   AX,WORD PTR ED_HD1PM+05 ; GET PRE-COMP CYLS
  338. ;
  339. ; -----  CONVERT WRITE PRE-COMP TO HEX ASCII & PRINT
  340. ;
  341.          CALL  ED_CVHA            ; CONVERT TO ASCII
  342. ;
  343.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  344.          INT   10H                ; RUPT TO BIOS
  345. ;
  346.          LEA   BP,ED_WORKA        ; ES:BP POINT TO WORK AREA
  347.          MOV   DX,0639H           ; SET ROW/COL
  348.          MOV   CX,4               ; LENGTH OF STRING
  349.          MOV   BL,07H             ; WRITE ATTRIBUTE
  350.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  351.          INT   10H                ; RUPT TO BIOS
  352. ;
  353. ; -----  GET THE CONTROL BYTE
  354. ;
  355.          MOV   AX,WORD PTR ED_HD1PM+08 ; GET CONTROL BYTE
  356. ;
  357. ; -----  CONVERT CONTROL BYTE TO HEX ASCII & PRINT
  358. ;
  359.          CALL  ED_CVHA            ; CONVERT TO ASCII
  360. ;
  361.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  362.          INT   10H                ; RUPT TO BIOS
  363. ;
  364.          LEA   BP,ED_WORKA+3      ; ES:BP POINT TO WORK AREA
  365.          MOV   DX,073BH           ; SET ROW/COL
  366.          MOV   CX,1               ; LENGTH OF STRING
  367.          MOV   BL,07H             ; WRITE ATTRIBUTE
  368.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  369.          INT   10H                ; RUPT TO BIOS
  370. ;
  371. ; -----  GET THE LANDING ZONE
  372. ;
  373.          MOV   AX,WORD PTR ED_HD1PM+12 ; GET LANDING ZONE
  374. ;
  375. ; -----  CONVERT LANDING ZONE TO DECIMAL ASCII & PRINT
  376. ;
  377.          CALL  ED_CVDA            ; CONVERT TO ASCII
  378. ;
  379.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  380.          INT   10H                ; RUPT TO BIOS
  381. ;
  382.          LEA   BP,ED_WORKA        ; ES:BP POINT TO WORK AREA
  383.          MOV   DX,0839H           ; SET ROW/COL
  384.          MOV   CX,4               ; LENGTH OF STRING
  385.          MOV   BL,07H             ; WRITE ATTRIBUTE
  386.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  387.          INT   10H                ; RUPT TO BIOS
  388. ;
  389. ; -----  GET SECTORS/TRACK
  390. ;
  391.          MOV   AL,BYTE PTR ED_HD1PM+14 ; GET SECTORS/TRACK
  392.          MOV   AH,0               ; CLEAR AH
  393. ;
  394. ; -----  CONVERT SECTORS/TRACK TO DECIMAL ASCII & PRINT
  395. ;
  396.          CALL  ED_CVDA            ; CONVERT TO ASCII
  397. ;
  398.          MOV   AH,0FH             ; REQUEST CURRENT VIDEO MODE
  399.          INT   10H                ; RUPT TO BIOS
  400. ;
  401.          LEA   BP,ED_WORKA+2      ; ES:BP POINT TO WORK AREA
  402.          MOV   DX,093BH           ; SET ROW/COL
  403.          MOV   CX,2               ; LENGTH OF STRING
  404.          MOV   BL,07H             ; WRITE ATTRIBUTE
  405.          MOV   AX,1300H           ; WRITE CHARACTER STRING REQUEST
  406.          INT   10H                ; RUPT TO BIOS
  407. ;
  408. ED_EXIT:
  409.          MOV   AH,4CH             ; RETURN TO CALLER
  410.          INT   21H
  411. ED_LDP   ENDP
  412. ED_CVDA  PROC  NEAR               ; CONVERT BINARY IN AX TO ASCII DEC
  413.          PUSH  BX                 ; SAVE BX REG
  414.          PUSH  DX                 ; SAVE DX REG
  415.          PUSH  SI                 ; SAVE SI REG
  416.          MOV   WORD PTR ED_WORKA+0,'  '  ; CLEAR THE
  417.          MOV   WORD PTR ED_WORKA+2,'  '  ;  WORK AREA
  418.          LEA   BX,ED_WORKA+3      ; GET ADDRESS OF WORK AREA
  419.          MOV   SI,10              ; GET DIVISOR, BASE 10
  420. ED_CVDAL:
  421.          SUB   DX,DX              ; CLEAR DIVIDEND
  422.          DIV   SI                 ; DIVIDE BY 10
  423.          ADD   DL,'0'             ; MAKE ASCII
  424.          MOV   ES:[BX],DL         ; SAVE THE CHARACTER
  425.          DEC   BX                 ; BACK UP THROUGH WORK AREA
  426.          CMP   AX,0               ; DONE ?
  427.          JNE   ED_CVDAL           ; ...NO - LOOP
  428. ;
  429.          POP   SI                 ; RESTORE SI REG
  430.          POP   DX                 ; RESTORE DX REG
  431.          POP   BX                 ; RESTORE BX REG
  432.          RET                      ; RETURN TO CALLER
  433. ED_CVDA  ENDP
  434. ED_CVHA  PROC  NEAR               ; CONVERT BINARY IN AX TO ASCII DEC
  435.          PUSH  BX                 ; SAVE BX REG
  436.          PUSH  AX                 ; SAVE A COPY OF AX
  437.          LEA   BX,ED_HEXTT        ; GET ADDRESS OF XLAT TABLE
  438.          AND   AL,0FH             ; ISOLATE LOW ORDER NIBBLE
  439.          XLAT  ED_HEXTT           ; CONVERT TO ASCII
  440.          MOV   ED_WORKA+3,AL      ; PUT IN OUTPUT AREA
  441. ;
  442.          POP   AX                 ; GET AX BACK
  443.          SHR   AL,4               ; ISOLATE HIGH ORDER NIBBLE
  444.          XLAT  ED_HEXTT           ; CONVERT TO ASCII
  445.          MOV   ED_WORKA+2,AL      ; PUT IN OUTPUT AREA
  446. ;
  447.          MOV   AL,AH              ; GET HIGH BYTE
  448.          AND   AL,0FH             ; ISOLATE LOW ORDER NIBBLE
  449.          XLAT  ED_HEXTT           ; CONVERT TO ASCII
  450.          MOV   ED_WORKA+1,AL      ; PUT IN OUTPUT AREA
  451. ;
  452.          MOV   AL,AH              ; GET HIGH BYTE
  453.          SHR   AL,4               ; GET HIGH NI
  454.          XLAT  ED_HEXTT           ; CONVERT TO ASCII
  455.          MOV   ED_WORKA+0,AL      ; PUT IN OUTPUT AREA
  456. ;
  457.          POP   BX                 ; RESTORE AX
  458.          RET                      ; RETURN TO CALLER
  459. ED_HEXTT DB    '0123456789ABCDEF'
  460. ED_CVHA  ENDP
  461.          CLS
  462.          INT    20H               ; RETURN TO DOS
  463. CSEG     ENDS                     ; END OF CODE SEG
  464.          END    TST_START
  465.